/*
 * @desc 针对本地存储的方法
 * @author WYK
 * @date 2020.04.21
 * @param {Number}  type
 *          1.localStorage
 *          2.sessionStorage
 * @return {void}
 */

import {getType} from './tools'
import {getEnvByName} from './env'

// 前缀设置
function setPreName(key) {
  return getEnvByName('save_name') + key
}

// 判断是否支持storage
function isSupport(type) {
  switch (type) {
  case 1:
    if (!window.localStorage) {
      throw new Error('浏览器不支持localStorage')
    }
    break
  case 2:
    if (!window.sessionStorage) {
      throw new Error('浏览器不支持sessionStorage')
    }
    break
  }
}

// 存储类型
function storageType(type = 1) {
  let store
  switch (type) {
  case 1:
    store = window.localStorage
    break
  case 2:
    store = window.sessionStorage
    break
  }
  return store
}

// 存
export function saveStorage(key, value, time, type = 1) {
  // 判断浏览器是否支持存储
  isSupport(type)

  const store = storageType(type)

  let expiresTime = new Date().getTime() + Number(time)

  // 包装数据
  let saveObj = {
    key,
    value,
  }

  if (time) saveObj.expiresTime = expiresTime

  // 判断类型  如果不是字符类型，转换为字符串
  if (getType(saveObj) !== 'String') saveObj = JSON.stringify(saveObj)

  store.setItem(setPreName(key), saveObj)
}

// 当传入一个对象存储的时候，需要对象中的字段，拆分为多条存储的时候使用,需要确保传入的为一个对象，并且属性名为所想要存的的key
export function saveSplitStorage(data, type = 1) {
  Object.keys(data).forEach(key => {
    saveStorage(key, data[key], type)
  })
}

// 取
export function getStorage(key, type = 1) {
  const store = storageType(type)

  let saveObj = JSON.parse(store.getItem(setPreName(key)))

  if (!saveObj) {
    // 找不到直接返回null
    return null
  } else  if (saveObj.expiresTime && new Date().getTime() > saveObj.expiresTime) {
    // 如果设置了时间，判断是否过期
    // 如果过期了

    // 删除当前数据
    delStorage(key)
    // 返回null
    return null
  } else {
    // 不过期是正常，则返回value值
    return saveObj.value
  }
}

// 删
export function delStorage(key, type = 1) {
  const store = storageType(type)
  store.removeItem(setPreName(key))
}

// 用于删除部分数据，参数为一个数组，存储的为需要删除的key列表
export function delPartStorage(storageList, type = 1) {
  storageList.forEach(key => {
    delStorage(key, type)
  })
}

// 全删
export function delAllStorage(type = 1) {
  const store = storageType(type)
  store.clear()
}
